// 拓扑排序模版（牛客）
// 邻接表建图（动态方式）
// 测试链接 : https://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c
// 提交以下所有代码，可以直接通过

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int MAXN = 200001; // 点的最大数量
int n; // 点的数量
int m; // 边的数量

int q[MAXN]; // 拓扑排序用到的队列
int indegree[MAXN]; // 拓扑排序用到的入度表
int ret[MAXN]; // 收集拓扑排序的结果
int l, r;

// 有拓扑排序返回 true，没有拓扑排序返回 false
bool topoSort(vector<vector<int>>& graph)
{
    l = r = 0;
    for(int i = 1; i <= n; ++i) if(!indegree[i]) q[r++] = i;
    
    int fill = 0; 
    while(l < r)
    {
        int x = q[l++];
        ret[fill++] = x;
        for(int y : graph[x])
        {
            if(--indegree[y] == 0) q[r++] = y;
        }
    }
    return fill == n;
}

int main() 
{   
    cin >> n >> m;
    // 动态建图，比赛肯定不行，但是一般大厂笔试、面试允许
    vector<vector<int>> graph(n + 1);
    for(int i = 0; i < m; ++i)
    {
        int from, to;
        cin >> from >> to;
        graph[from].emplace_back(to);
        ++indegree[to];
    }
    if(!topoSort(graph))
    {
        cout << "-1" << endl;
    }
    else
    {
        for(int i = 0; i < n - 1; ++i)
        {
            cout << ret[i] << " ";
        }
        cout << ret[n - 1] << endl;
    }
    return 0;
}